// 2-3-2 引用-重要概念-把引用作为返回值

/**
 * C++ 引用
 * 引用变量是一个别名，也就是说，它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量，就可以使用该引用名称或变量名称来指向变量。
 * 
 * ----------------
 * 重要概念
 * 引用通常用于函数参数列表和函数返回值。下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念：
 * 1. 把引用作为参数
 * 	C++ 支持把引用作为参数传给函数，这比传一般的参数更安全。
 * 
 * 2. 把引用作为返回值
 *  可以从 C++ 函数中返回引用，就像返回其他数据类型一样。
 * 
 * ~~~~~~~~~~~~~~~~~~~~~~~~
 * 把引用作为返回值
 * 通过使用引用来替代指针，会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用，方式与返回一个指针类似。
 * 当函数返回一个引用时，则返回一个**指向返回值的隐式指针**。这样，函数就可以放在赋值语句的左边。例如，请看下面这个简单的程序（示例一）：
*/
#include <iostream>

double &setValue(int i);
double nums[] = {20.02, 2.3, 3.4, 4.2312, 5.6};

int &test();

int main(void)
{
  /**
   * 示例一
  */
  int size = sizeof(nums) / sizeof(double);
  // double *ptr = nums;
  std::cout << "--------修改前--------" << std::endl;
  for (int i = 0; i < size; i++)
  {
    std::cout << "nums[" << i << "] : " << nums[i] << std::endl;
  }

  setValue(0) = 1.2;
  setValue(3) = 4.5;

  std::cout << "--------修改后--------" << std::endl;
  for (int i = 0; i < size; i++)
  {
    std::cout << "nums[" << i << "] : " << nums[i] << std::endl;
  }

  test();

  printf("-----------end---------------\n");
  return 0;
}

double &setValue(int i)
{
  double &ref = nums[i];
  return ref;
}

int &test()
{
  // int a = 1;// warning: reference to local variable 'a' returned [-Wreturn-local-addr]
  int static a = 1;
  return a;
}